import max from "./max.js";
import min from "./min.js";

/**
 * 给定一个数组 x，此函数将找到 x 的范围，并返回一个可用于将 x 分类为多个类别的断点数组。
 * 返回的数组总是比类别数多 1，因为它包含最小值。
 *
 * @param {Array<number>} x 一个数值数组
 * @param {number} nClasses 所需的类别数
 * @returns {Array<number>} 类别断点位置的数组
 * @example
 * equalIntervalBreaks([1, 2, 3, 4, 5, 6], 4); // => [1, 2.25, 3.5, 4.75, 6]
 */
function equalIntervalBreaks(x, nClasses) {
    if (x.length < 2) {
        return x;
    }

    const theMin = min(x);
    const theMax = max(x);

    // 第一个断点总是数据集中的最小值
    const breaks = [theMin];

    // 每个断点的大小是数据集的全范围除以所需的类别数
    const breakSize = (theMax - theMin) / nClasses;

    // 在 nClasses = 1 的情况下，此循环不会运行
    // 返回的断点将是 [min, max]
    for (let i = 1; i < nClasses; i++) {
        breaks.push(breaks[0] + breakSize * i);
    }

    // 最后一个断点总是最大值
    breaks.push(theMax);

    return breaks;
}

export default equalIntervalBreaks;
